Skip to content

[0.83] Backport performance debugging improvements#56372

Open
huntie wants to merge 1 commit intofacebook:0.83-stablefrom
huntie:0.83-perf-trace-backcompat
Open

[0.83] Backport performance debugging improvements#56372
huntie wants to merge 1 commit intofacebook:0.83-stablefrom
huntie:0.83-perf-trace-backcompat

Conversation

@huntie
Copy link
Copy Markdown
Member

@huntie huntie commented Apr 8, 2026

Summary

Backports some CDP Performance features and stability improvements to 0.83-stable. This supports a validation project with these features within Expo.

This includes:

  • Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
  • New support for Frame Timings and screenshot capture on iOS
  • Optimisations to trace chunk generation, memory usage during performance recording
  • Page.captureScreenshot (Android, iOS)

All features remain gated behind feature flags (fuseboxFrameRecordingEnabled, fuseboxScreenshotCaptureEnabled).

Commits applied

This branch is a squashed version of https://github.com/huntie/react-native/tree/0.83-perf-trace-backcompat-raw. All commits except those prefixed [LOCAL] (last 3) are picks from main.

57 commits
Another view: What isn't picked from main from jsinspector-modern

Diff of this branch vs facebook/main

Features on main not included in the 0.83-perf-trace-backcompat branch:

  1. Perf monitor overlay improvements (Android) — Auto-expiring issue counts (20s), auto-hide in CDP mode, custom perf issue icon.
  2. Background trace stashing in C++ HostTarget — Stash-and-emit lifecycle owned by C++ rather than platform Java layer.
  3. Stack traces on measures/timestampsrnStackTrace field on reportMeasure() and reportTimeStamp() trace events.
  4. ResourceReceivedData network trace eventencodedDataLength tracking for network resource timeline events.
  5. Multi-agent NetworkIOAgent — Per-agent enable/disable with agent IDs and destructor cleanup.
  6. iOS RCTHost API changesRCTBundleConfiguration param, updated host:didInitializeRuntime: delegate with deprecation shim.

Changelog: [Internal]

Test Plan

Compile locally. No Hermes updates are required.

yarn test-release-local -t RNTester -p [Android|iOS]

Flags disabled (default)

Record a performance trace (existing features).

Android iOS
image image
✅ Success ✅ Success

Flags enabled

Note

Depends on facebook/react-native-devtools-frontend#248, which will be opened as a separate pick request. (Locally applied via node scripts/debugger-frontend/sync-and-build --branch 0.83- perf-trace-backcompat)

Android iOS
image image
✅ Feature enabled NUX ✅ Feature enabled NUX
image image
✅ Frames track with screenshots ✅ Frames track with screenshots

@meta-cla meta-cla bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Apr 8, 2026
@facebook-github-tools facebook-github-tools bot added p: Facebook Partner: Facebook Partner labels Apr 8, 2026
@huntie huntie force-pushed the 0.83-perf-trace-backcompat branch from 55b30ce to 64f701d Compare April 8, 2026 15:40
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 8, 2026

Warning

JavaScript API change detected

This PR commits an update to ReactNativeApi.d.ts, indicating a change to React Native's public JavaScript API.

  • Please include a clear changelog message.
  • This change will be subject to additional review.

This change was flagged as: BREAKING

huntie added a commit to huntie/react-native that referenced this pull request Apr 9, 2026
Summary:
The `React-RuntimeApple` pod/target was missing the `REACT_NATIVE_DEBUGGER_ENABLED` preprocessor define in both open source build configurations.

Without this, the experimental-and-flagged `fuseboxFrameRecordingEnabled` feature (D95566220) was misbehaving on iOS — code paths in `RCTHost.mm` were unexpectedly compiled out.

See facebook#56372.

Changelog: [Internal]

Differential Revision: D100157250
Backports some CDP Performance features and stability improvements to `0.83-stable`.

This includes:
- Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
- New support for Frame Timings and screenshot capture on iOS
- Optimisations to trace chunk generation, memory usage during performance recording
- `Page.captureScreenshot` (Android, iOS)

All features remain gated behind feature flags (`fuseboxFrameRecordingEnabled`, `fuseboxScreenshotCaptureEnabled`).

**Commits applied**

- Define TracingCategory enum (facebook#54377) bd6c6bf
- Use TracingCategory in TraceEvent (facebook#54378) ce60f27
- Simple parser for serialized tracing categories (facebook#54379) 62275b6
- Propagate tracing categories to recording state (facebook#54380) 3841ef0
- Re-land "Revert D85999774: [rn][android] Add FrameTiming module" (facebook#54502) 85905ad
- Add screenshot category (facebook#54537) 5d9cb80
- Define HostTargetTracingDelegate (facebook#54622) be0dae0
- Define TracingDelegate for Android Host (facebook#54628) a212e95
- Use new API for tracing state on Android (facebook#54629) 532d0be
- Internalize TracingState interface (facebook#54631) 58ec261
- Move TracingState interfaces to inspector package (facebook#54632) 10d0d99
- Rename values of TracingState enum (facebook#54630) be94707
- FrameTiming module to subscribe to Inspector tracing lifecycle (facebook#54633) 04ee02b
- Clarify HostTracingProfile and HostTraceRecordingState (facebook#54677) ec92f12
- Introduce TimeWindowedBuffer (facebook#54679) d6ee54f
- Keep tracing time window on TraceRecordingState (facebook#54673) e651563
- Define FrameTimingSequence (facebook#54674) 5b7d92f
- Define an endpoint on HostTarget to capture frame timings (facebook#54672) f469aa3
- Extract frame trace events construction logic (facebook#54675) 57973fa
- Define serializers for frame timings as part of HostTargetTracingProfile (facebook#54681) 587d360
- Propagate Frames data through Host (facebook#54671) 26ff069
- Cleanup no longer used jni layer for frame timings (facebook#54678) 9ba4ce6
- Fix screenshot typo (facebook#54742) 52186a3
- Add optional screenshot argument to FrameTimingSequence (facebook#54743) 57c29fc
- Frame screenshot event generation (facebook#54744) b447d26
- Frame screenshots capture implementation (facebook#54745) f3c9a8d
- BeginDrawing: INTENDED_VSYNC_TIMESTAMP -> VSYNC_TIMESTAMP (facebook#54765) 9221772
- Add frames category (facebook#54768) 31a0c9a
- Specify correct category for SetLayerTreeId event (facebook#54769) cd055e9
- Reduce the screenshots size (facebook#54800) e4a5a56
- Remove Commit from FrameTimingSequence (facebook#54779) 39f7703
- Fix potential bitmap leaks in FrameTimingsObserver (facebook#55652) 3918dd1
- Capture initial screenshot when starting frame timing trace (facebook#55720) 863f5c0
- Refactor FrameTimingsObserver for multi-activity support (facebook#55740) 8230f3b
- Reorder FrameTimingsObserver methods (facebook#55743) f56b295
- Increase frame capture quality, apply scaling after DPI normalization (facebook#55731) e5f9f5f
- Fix FrameTimingsObverver to initiate PixelCopy on main thread (facebook#55744) d552f2a
- Fix bitmap reuse race condition in FrameTimingsObserver (facebook#55745) 3924768
- Fix trailing frame capture after recording ended (facebook#55704) 47684ca
- Move base64Encode into react/utils (facebook#55873) 422770d
- Move screenshot Base64 encoding to trace serialization (facebook#55803) dc4c36e
- Restore inspector addPage listener callback (facebook#55925) 8c763fc
- Add tracing helper functions for RNDT traces in C++ and Kotlin (facebook#55935) 4f3f536
- Introduce fuseboxFrameRecordingEnabled flag, gate existing code (facebook#55941) 1aa7a32
- Implement Performance frames and screenshots on iOS (facebook#56015) 64a1a10
- Add pixel diffing to RCTFrameTimingsObserver (facebook#56043) 9d231af
- Add dynamic sampling to frame screenshots (facebook#56048) d309cda
- Switch trace event chunks from event count to size based (facebook#56080) d3b33f5
- Increase trace screenshot scale factor to 1x (facebook#56079) 972a30d
- Add Page.captureScreenshot CDP support (facebook#56307) 77332d2
- Fix data race on PerformanceObserver entry buffer (facebook#56352) 5eb1ca1
- Add dynamic sampling to frame screenshots (facebook#56135) e0d1e29
- Increase trace screenshot scale factor to 1x (facebook#56136) 90e02fa
- Add missing debugger define for React-RuntimeApple (facebook#56397)
- [LOCAL] Remove stale frame event code from PerformanceTracer
- [LOCAL] Update Podfile.lock
@huntie huntie force-pushed the 0.83-perf-trace-backcompat branch from 64f701d to 2dd3405 Compare April 9, 2026 12:38
@huntie
Copy link
Copy Markdown
Member Author

huntie commented Apr 9, 2026

Fully tested, ready for review. iOS required a fix on main, opened as #56397

@huntie huntie marked this pull request as ready for review April 9, 2026 12:38
huntie added a commit to huntie/react-native that referenced this pull request Apr 9, 2026
meta-codesync bot pushed a commit that referenced this pull request Apr 9, 2026
Summary:
Pull Request resolved: #56397

The `React-RuntimeApple` pod/target was missing the `REACT_NATIVE_DEBUGGER_ENABLED` preprocessor define in both open source build configurations.

Without this, the experimental-and-flagged `fuseboxFrameRecordingEnabled` feature (D95566220) was misbehaving on iOS — code paths in `RCTHost.mm` were unexpectedly compiled out.

See #56372.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D100157250

fbshipit-source-id: 8c11287f34ac6029dd1153a01fed6ba93cc7d398
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. p: Facebook Partner: Facebook Partner Pick Request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant